#include <QCoreApplication>
#include <QThread>

#include "myworker.h"

// class MyWorker : public QObject {
//     Q_OBJECT

// public slots:
//     void doWork() {

//         qDebug() << QThread::currentThread() << "doWork is called";

//         while(0){
//             qDebug() << QThread::currentThread() << "Worker thread running" ;
//             // 执行耗时操作
//             QThread::sleep(3);
//         }

//         qDebug() << QThread::currentThread() << "doWork is finished";
//     }
// };


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << QThread::currentThread() << "Main thread started" ;

 //子线程调用
        //创建一个管理线程上下文的对象
    QThread* workerThread1 = new QThread;

    //在主线程的上下文context空间，创建一个task对象
    MyWorker* myworker1 = new MyWorker;

    // 将 Worker 对象移到 workerThread 线程的上下文中
    myworker1->moveToThread(workerThread1);

    // 把线程的started信号与关心此信号的myworker1对象的槽函数doWork关联起来
    // 该槽函数被哪个线程调用执行，取决于该对象与线程的关系。
    // 1. 对象是由线程A创建的，在线程A的上下文，则该对象的槽函数被线程A执行
    // 2. 对象是由线程B创建的，在线程B的上下文，（本案例）
    //    但通过movetoThread，关联到进程B的上下文，则该对象的槽函数被线程B执行但
    QObject::connect(workerThread1, &QThread::started, myworker1, &MyWorker::doWork, Qt::QueuedConnection);
    //主线程向thread对象发送start信号，启动一个子线程，并执行子线程的run函数
    //run函数会检测QThread的信号队里，并执行信号对应的槽函数。
    //子线程的run启动完成后，子线程对象会发送started信号

    workerThread1->start();
    // 当线程启动时，执行 Worker 的 doWork() 槽函数
    // 线程也是一个对象，因此可以使用对象之间的通信机制，进行通信
    // 子线程启动成功后，子线程立即发送此信号：started
    // myworker1对象的槽函数doWork会被调用


    return a.exec();
}
